from pydantic import BaseModel, Field
import typing as T
from openai._types import NOT_GIVEN
from ...init import ENV


class ChatBaseModel(BaseModel):
    question: str = Field(description="问题 【必填】")
    model: T.Literal["qwen-plus"] = Field(
        default=ENV.MODEL_NAME, description="模型名称【可选】"
    )
    stream: T.Literal[True, False] = Field(
        default=False, description="是否流式推理【可选】"
    )
    sessionId: T.Optional[int] = Field(
        default=None,
        description="会话id【如果在请求头中没有就不会有历史对话记录给模型】",
    )
    temperature: T.Optional[int] = Field(
        default=NOT_GIVEN,
        description="温度，用于控制生成结果的随机性，值越大表示结果更随机，值越小表示结果越稳定，建议选择在0~2之间【可选】",
    )
    max_completion_tokens: T.Optional[int] = Field(
        default=NOT_GIVEN, description="最大生成token数【可选】"
    )
    frequency_penalty: T.Optional[float] = Field(
        default=NOT_GIVEN,
        description="频率惩罚，用于控制模型生成的结果中，重复出现的词的频率，值越大表示结果越随机，值越小表示结果越稳定，-2~2之间【可选】",
    )
    presence_penalty: T.Optional[float] = Field(
        default=NOT_GIVEN,
        description="存在惩罚，用于控制模型生成的结果中，新出现的词的频率，值越大表示结果越随机，值越小表示结果越稳定，-2~2之间【可选】",
    )
    top_p: T.Optional[float] = Field(
        default=NOT_GIVEN,
        description="核采样，控制生成文本随机性的，值越大表示结果越随机，值越小表示结果越稳定，0~1之间【可选】",
    )
    modalities: T.Optional[T.List[str]] = Field(
        default=["text"],
        description="模型输出的模态目前只有['text']，默认为['text']【可选】",
    )
